package com.smile.frame.springbootsatoken.config.core;


import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Sa-Token 上下文处理器 [ThreadLocal 版本] ---- 对象存储器
 *
 * <p> 一般情况下你不需要直接操作此类，因为框架的 starter 集成包里已经封装了完整的上下文操作 </p>
 *
 * @author click33
 * @since 1.16.0
 */
public class SaTokenContextForThreadLocalStaff {
	
	/**
	 * 基于 ThreadLocal 的 [ Box 存储器 ]
	 */
	public static ThreadLocal<TokenContextModelBox> modelBoxThreadLocal = new ThreadLocal<>();
	
	/**
	 * 初始化当前线程的 [ Box 存储器 ]
	 */
	public static void setModelBox(HttpServletRequest request, HttpServletResponse response) {
		TokenContextModelBox bok = new TokenContextModelBox(request, response);
		modelBoxThreadLocal.set(bok);
	}

	/**
	 * 清除当前线程的 [ Box 存储器 ]
	 */
	public static void clearModelBox() {
		modelBoxThreadLocal.remove();
	}

	/**
	 * 获取当前线程的 [ Box 存储器 ]
	 * @return /
	 */
	public static TokenContextModelBox getModelBoxOrNull() {
		return modelBoxThreadLocal.get();
	}
	
	/**
	 * 获取当前线程的 [ Box 存储器 ], 如果为空则抛出异常
	 * @return /
	 */
	public static TokenContextModelBox getModelBox() {
		TokenContextModelBox box = modelBoxThreadLocal.get();
		if(box ==  null) {
//			throw new SaTokenContextException("SaTokenContext 上下文尚未初始化").setCode(SaErrorCode.CODE_10002);
		}
		return box;
	}

	/**
	 * 在当前线程的 HttpServletRequest 包装对象
	 * 
	 * @return /
	 */
	public static HttpServletRequest getRequest() {
		return getModelBox().getRequest();
	}

	/**
	 * 在当前线程的 HttpServletResponse 包装对象
	 * 
	 * @return /
	 */
	public static HttpServletResponse getResponse() {
		return getModelBox().getResponse();
	}


}
